﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class Recurso
    {

        public decimal getParcialUsoTotalECItem(dbGestionDataContext _db)
        {
            // en la estructrua de costo no se realiza ninguna conversion por tal motivo
            // se utiliza 2 digitos = al origen del recurso
            
            decimal result = 0;

            var q = (from i in _db.EstructuraCostoItems
                     where i.idRecurso == this.idInternal 
                     select i);

            if (q.Count() > 0)
            {
                result = q.Sum(p => p.total).Value;
            }
           

            return Math.Round(result, 2);
        }

       public decimal getParcialUsoTotalHijos(dbGestionDataContext _db)
        {
            // en la estructrua de costo no se realiza ninguna conversion por tal motivo
            // se utiliza 2 digitos = al origen del recurso
            
            decimal result = 0;


            // suma ademas los valores de lo ya partido
            var qq = (from i in _db.Recursos
                      where i.idPadre == this.idInternal
                      select i);

            if (qq.Count() > 0)
            {
                result = qq.Sum(p => p.parcialUso).Value;
            }
           

            return Math.Round(result, 2);
        }


         

        public decimal getCantidadUsoTotalHijos(dbGestionDataContext _db)
        {
            decimal result = 0;

            //agregamos si esta partido
            var wer = from a in _db.Recursos
                      where a.idPadre == this.idInternal
                      select a;
            if (wer.Count() > 0)
            {
                result = wer.Sum(p => p.cantidadUso).Value;
            }


            return Math.Round(result, 4);
        }


        public decimal getCantidadUsoTotalECItem(dbGestionDataContext _db)
        {
            decimal result = 0;

            var q = (from i in _db.EstructuraCostoItems
                     where i.idRecurso == this.idInternal
                     select i);

            if (q.Count() > 0)
            {
                result = q.Sum(p => p.cantidad).Value;
            }

            return Math.Round(result, 4);
        }

        public bool updateUso(dbGestionDataContext _db)
        {
           // solo actualiza su total uso y cantidad, debido a que son de la misma
            //moneda es directa la actualizacion

            this.parcialUso = this.getParcialUsoTotalECItem(_db) + getParcialUsoTotalHijos(_db);
            
            if (this.unidad.ToUpper() != "GLB")
            {
                this.cantidadUso = this.getCantidadUsoTotalECItem(_db) + getCantidadUsoTotalHijos(_db);
               
                
            }
            else
            {
                // para los casos de global que son sub cantrata la cantidad es 1, por
                // cada descarga.
                
                this.cantidadUso = 0;
                if (this.parcialUso > 0)
                {
                    this.cantidadUso = 1;
                }
            }

            _db.SubmitChanges();
            
            return true;
        }

        public int Add(dbGestionDataContext _db,
            int idInsumo,
            string codigo,
            string descripcion,
            string unidad,
            decimal? cuadrilla,
            decimal cantidad,
            decimal precio,
            decimal parcial,
            int idPartida,
            int? grupo,
            int nivel,
            int? idPadre)
        {

            this.setOnInsert(
                idInsumo,
               codigo,
               descripcion,
               unidad,
               cuadrilla,
               cantidad,
               precio,
               parcial,
               idPartida,
               grupo,
               nivel,
               idPadre);

            //this.parcialMonBase = recurso.parcial.Value / tipoCambio;
            _db.Recursos.InsertOnSubmit(this);
            _db.SubmitChanges();

            return this.idInternal;
        
        }
       


        public void setOnInsert(
            int idInsumo,
            string codigo,
            string descripcion,
            string unidad,
            decimal? cuadrilla,
            decimal cantidad,
            decimal precio,
            decimal parcial,
            int idPartida,
            int? grupo,
            int nivel,
            int? idPadre)
        {
            this.idInternal = idInternal;
            this.idInsumo = idInsumo;
            this.codigo = codigo;
            this.descripcion = descripcion;
            this.unidad = unidad;
            this.cuadrilla = cuadrilla;
            this.cantidad = cantidad;
            this.precio = precio;
            this.parcial = parcial;
            this.idPartida = idPartida;
            this.cantidadUso = 0;
            this.parcialUso = 0;
            this.grupo = grupo;
            this.nivel = nivel;
            this.bitsel = true;
            this.idPadre = idPadre;
           
        }

        public void Update(dbGestionDataContext _db,
            int idInsumo,
            string codigo,
            string descripcion,
            string unidad,
            decimal cuadrilla,
            decimal cantidad,
            decimal precio,
            decimal parcial,
            int nivel)
        {

            this.idInsumo = idInsumo;
            this.codigo = codigo;
            this.descripcion = descripcion;
            this.unidad = unidad;
            this.cuadrilla = cuadrilla;
            this.cantidad = cantidad;
            this.precio = precio;
            this.parcial = parcial;
            this.nivel = 0;
            
            _db.SubmitChanges();

        
        
        }

        public void Update(dbGestionDataContext _db,
           int idInsumo,
           string codigo,
           string descripcion,
           string unidad,
          
           decimal cantidad,
           decimal precio,
           decimal parcial,
           int nivel)
        {

            this.idInsumo = idInsumo;
            this.codigo = codigo;
            this.descripcion = descripcion;
            this.unidad = unidad;
           
            this.cantidad = cantidad;
            this.precio = precio;
            this.parcial = parcial;
            this.nivel = 0;

            _db.SubmitChanges();



        }
    }
}
